/*
    This file is part of QTau
    Copyright (C) 2013-2018  Tobias "Tomoko" Platen <tplaten@posteo.de>
    Copyright (C) 2013       digited       <https://github.com/digited>
    Copyright (C) 2010-2013  HAL@ShurabaP  <https://github.com/haruneko>

    QTau is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

    SPDX-License-Identifier: GPL-3.0+
*/

#ifndef LESYNTH_H
#define LESYNTH_H

#include "PluginInterfaces.h"
#include <QJsonArray>
#include <QList>
#include <QMap>

#include "sekai/VVDReader.h"
#include "jack/ringbuffer.h"

#include "sndfile.h"

#include <QThread>
#include <QMap>
#include <QString>
#include <QStringList>


class UTAUDB;
class WorldSynth2;


struct oto_entry;

struct utau_note
{
    float start;
    float end;
    QString lyric;
    float f0;

    float offset;
    float consonant;
    float cutoff;
    float preutter;
    int vvdIndex;
    oto_entry* oto;
};


class UTAUSynth : public QObject, public ISynth
{
    Q_OBJECT
    Q_PLUGIN_METADATA(IID c_isynth_comname FILE "utau_synth.json")
    Q_INTERFACES(ISynth)


public:
    UTAUSynth() {}

    //plugin loading
    QString name()                              override;
    QString description()                       override;
    QString version()                           override;
    void setup(IController *ctrl)               override;

    //synth base
    bool setCacheDir(QString cacheDir)          override;
    bool setScore(const QJsonArray&)            override;
    bool synthesize()                           override;
    bool synthIsRealtime()                      override;
    int readData(float *data, int size)         override;



    //lyricizer
    QString getTranscription(QString txt)       override;
    bool doPhonemeTransformation(QStringList& lyrics) override;

    //voice manager
    bool setVoice(QString voiceName) override;
    QStringList listVoices() override;


private:
    void buildScore();
    void scanUtauDir();
    void synthThread();




private:

    //synth common
    QJsonArray _score;
    IController* _ctrl;

   // QMap<QString,int> _vvdMap;
    QList<utau_note*> _segments;
    int _jack_samplerate;

    //int buffer_size;
    WorldSynth2* _synth;
    VVDReader* _reader;
    float* _vvddata;

    QMap<QString,UTAUDB*> _voices;
    UTAUDB* _currentUTAU;

    QMap<QString,QString> _kana2romaji;
    QMap<QString,QString> _romaji2kana;

    bool _threadRunning = false;

signals:
    void endOfThread();
    void logError(QString error);
    void logSuccess(QString success);
    void logDebug(QString debug);

public slots:
    void on_logError(QString error);
    void on_logSuccess(QString success);
    void on_logDebug(QString debug);
    void on_endOfThread();

};

#define SETSEEK 1
#endif // LESYNTH_H
